using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._CartographyTools._Masking
{
    /// <summary>
    /// <para>Intersecting Layers Masks</para>
    /// <para>Creates masking polygons at a specified shape and size at the intersection of two symbolized input layers: the masking layer and the masked layer.</para>
    /// <para>在两个符号化输入图层（遮罩图层和遮罩图层）的交点处创建具有指定形状和大小的遮罩面。</para>
    /// </summary>    
    [DisplayName("Intersecting Layers Masks")]
    public class IntersectingLayersMasks : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public IntersectingLayersMasks()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_masking_layer">
        /// <para>Masking Layer</para>
        /// <para>The symbolized input layer that will intersect the masked layer to create masking polygons. This is the layer that will be prominently displayed when masking is applied to the masked layer.</para>
        /// <para>将与遮罩图层相交以创建遮罩面的符号化输入图层。这是将遮罩应用于遮罩层时将突出显示的图层。</para>
        /// </param>
        /// <param name="_masked_layer">
        /// <para>Masked Layer</para>
        /// <para>The symbolized input layer to be masked. This is the layer that will be obscured by the masking polygons.</para>
        /// <para>要屏蔽的符号化输入图层。这是将被遮罩面遮挡的图层。</para>
        /// </param>
        /// <param name="_output_fc">
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will contain the mask features.</para>
        /// <para>将包含蒙版要素的要素类。</para>
        /// </param>
        /// <param name="_reference_scale">
        /// <para>Reference Scale</para>
        /// <para>The reference scale used for calculating the masking geometry when masks are specified in page units. This is typically the reference scale of the map.</para>
        /// <para>当以页面单位指定蒙版时，用于计算遮罩几何图形的参考比例。这通常是地图的参考比例。</para>
        /// </param>
        /// <param name="_spatial_reference">
        /// <para>Calculation coordinate system</para>
        /// <para>The spatial reference of the map in which the masking polygons will be created. This is not the spatial reference that will be assigned to the output feature class. It is the spatial reference of the map in which the masking polygons will be used, since the position of symbology may change when features are projected.</para>
        /// <para>将在其中创建遮罩面的地图的空间参考。这不是将分配给输出要素类的空间参考。它是将使用遮罩面的地图的空间参考，因为在投影要素时符号系统的位置可能会发生变化。</para>
        /// </param>
        /// <param name="_margin">
        /// <para>Margin</para>
        /// <para><xdoc>
        ///   <para>The space in page units surrounding the symbolized input features used to create the mask polygons. Typically, masking polygons are created with a small margin around the symbol to improve visual appearance. Margin values are specified in either page units or map units. Most of the time, you will specify your margin distance value in page units.</para>
        ///   <para>The margin cannot be negative.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于创建蒙版面的符号化输入要素周围的空间（以页面单位为单位）。通常，在创建遮罩面时，符号周围留有很小的边距，以改善视觉外观。页边距值以页面单位或地图单位指定。大多数情况下，您将以页面单位指定边距值。</para>
        ///   <para>边距不能为负数。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_method">
        /// <para>Mask Kind</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of masking geometry created.</para>
        ///   <bulletList>
        ///     <bullet_item>Box—A polygon representing the extent of the symbolized feature.</bullet_item><para/>
        ///     <bullet_item>Convex hull—The convex hull of the symbolized geometry of the feature. This is the default.</bullet_item><para/>
        ///     <bullet_item>Exact simplified—A generalized polygon representing the exact shape of the symbolized feature. Polygons created with this method will have a significantly smaller number of vertices compared to polygons created with the EXACT method.</bullet_item><para/>
        ///     <bullet_item>Exact—A polygon representing the exact shape of the symbolized feature.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定创建的遮罩几何图形的类型。</para>
        ///   <bulletList>
        ///     <bullet_item>框 - 表示符号化要素范围的面。</bullet_item><para/>
        ///     <bullet_item>凸包 - 特征符号化几何的凸包。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>精确简化 - 表示符号化要素的确切形状的广义面。与使用 EXACT 方法创建的多边形相比，使用此方法创建的多边形的顶点数量要少得多。</bullet_item><para/>
        ///     <bullet_item>精确 - 表示符号化要素的确切形状的面。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_mask_for_non_placed_anno">
        /// <para>Create masks for unplaced annotation</para>
        /// <para><xdoc>
        ///   <para>Specifies whether to create masks for unplaced annotation. This option is only used when masking geodatabase annotation layers.</para>
        ///   <bulletList>
        ///     <bullet_item>All annotation features—Creates masks for all the annotation features.</bullet_item><para/>
        ///     <bullet_item>Only placed annotation features—Only creates masks for features with a status of placed.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否为未置入的批注创建蒙版。此选项仅在屏蔽地理数据库注记图层时使用。</para>
        ///   <bulletList>
        ///     <bullet_item>所有注记特征 （All annotation feature） - 为所有注记特征创建掩码。</bullet_item><para/>
        ///     <bullet_item>仅放置注记要素 - 仅为状态为放置的要素创建蒙版。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_attributes">
        /// <para>Transfer Attributes</para>
        /// <para><xdoc>
        ///   <para>Specifies the attributes that will be transferred from the input features to the output features.</para>
        ///   <bulletList>
        ///     <bullet_item>Only the FID field—Only the FID field from the input features will be transferred to the output features. This is the default.</bullet_item><para/>
        ///     <bullet_item>All attributes except the FID field—All the attributes except the FID from the input features will be transferred to the output features.</bullet_item><para/>
        ///     <bullet_item>All attributes—All the attributes from the input features will be transferred to the output features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将从输入要素传输到输出要素的属性。</para>
        ///   <bulletList>
        ///     <bullet_item>仅 FID 字段 - 仅输入要素中的 FID 字段将传输到输出要素。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>除 FID 字段外的所有属性—输入要素中除 FID 之外的所有属性都将传输到输出要素。</bullet_item><para/>
        ///     <bullet_item>所有属性—输入要素中的所有属性都将传输到输出要素。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public IntersectingLayersMasks(object _masking_layer, object _masked_layer, object _output_fc, double? _reference_scale, object _spatial_reference, string _margin, _method_value _method, _mask_for_non_placed_anno_value _mask_for_non_placed_anno, _attributes_value _attributes)
        {
            this._masking_layer = _masking_layer;
            this._masked_layer = _masked_layer;
            this._output_fc = _output_fc;
            this._reference_scale = _reference_scale;
            this._spatial_reference = _spatial_reference;
            this._margin = _margin;
            this._method = _method;
            this._mask_for_non_placed_anno = _mask_for_non_placed_anno;
            this._attributes = _attributes;
        }
        public override string ToolboxName => "Cartography Tools";

        public override string ToolName => "Intersecting Layers Masks";

        public override string CallName => "cartography.IntersectingLayersMasks";

        public override List<string> AcceptEnvironments => ["cartographicCoordinateSystem", "cartographicPartitions"];

        public override object[] ParameterInfo => [_masking_layer, _masked_layer, _output_fc, _reference_scale, _spatial_reference, _margin, _method.GetGPValue(), _mask_for_non_placed_anno.GetGPValue(), _attributes.GetGPValue()];

        /// <summary>
        /// <para>Masking Layer</para>
        /// <para>The symbolized input layer that will intersect the masked layer to create masking polygons. This is the layer that will be prominently displayed when masking is applied to the masked layer.</para>
        /// <para>将与遮罩图层相交以创建遮罩面的符号化输入图层。这是将遮罩应用于遮罩层时将突出显示的图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Masking Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _masking_layer { get; set; }


        /// <summary>
        /// <para>Masked Layer</para>
        /// <para>The symbolized input layer to be masked. This is the layer that will be obscured by the masking polygons.</para>
        /// <para>要屏蔽的符号化输入图层。这是将被遮罩面遮挡的图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Masked Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _masked_layer { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will contain the mask features.</para>
        /// <para>将包含蒙版要素的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _output_fc { get; set; }


        /// <summary>
        /// <para>Reference Scale</para>
        /// <para>The reference scale used for calculating the masking geometry when masks are specified in page units. This is typically the reference scale of the map.</para>
        /// <para>当以页面单位指定蒙版时，用于计算遮罩几何图形的参考比例。这通常是地图的参考比例。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Reference Scale")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _reference_scale { get; set; }


        /// <summary>
        /// <para>Calculation coordinate system</para>
        /// <para>The spatial reference of the map in which the masking polygons will be created. This is not the spatial reference that will be assigned to the output feature class. It is the spatial reference of the map in which the masking polygons will be used, since the position of symbology may change when features are projected.</para>
        /// <para>将在其中创建遮罩面的地图的空间参考。这不是将分配给输出要素类的空间参考。它是将使用遮罩面的地图的空间参考，因为在投影要素时符号系统的位置可能会发生变化。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Calculation coordinate system")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _spatial_reference { get; set; }


        /// <summary>
        /// <para>Margin</para>
        /// <para><xdoc>
        ///   <para>The space in page units surrounding the symbolized input features used to create the mask polygons. Typically, masking polygons are created with a small margin around the symbol to improve visual appearance. Margin values are specified in either page units or map units. Most of the time, you will specify your margin distance value in page units.</para>
        ///   <para>The margin cannot be negative.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于创建蒙版面的符号化输入要素周围的空间（以页面单位为单位）。通常，在创建遮罩面时，符号周围留有很小的边距，以改善视觉外观。页边距值以页面单位或地图单位指定。大多数情况下，您将以页面单位指定边距值。</para>
        ///   <para>边距不能为负数。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Margin")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public string _margin { get; set; }


        /// <summary>
        /// <para>Mask Kind</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of masking geometry created.</para>
        ///   <bulletList>
        ///     <bullet_item>Box—A polygon representing the extent of the symbolized feature.</bullet_item><para/>
        ///     <bullet_item>Convex hull—The convex hull of the symbolized geometry of the feature. This is the default.</bullet_item><para/>
        ///     <bullet_item>Exact simplified—A generalized polygon representing the exact shape of the symbolized feature. Polygons created with this method will have a significantly smaller number of vertices compared to polygons created with the EXACT method.</bullet_item><para/>
        ///     <bullet_item>Exact—A polygon representing the exact shape of the symbolized feature.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定创建的遮罩几何图形的类型。</para>
        ///   <bulletList>
        ///     <bullet_item>框 - 表示符号化要素范围的面。</bullet_item><para/>
        ///     <bullet_item>凸包 - 特征符号化几何的凸包。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>精确简化 - 表示符号化要素的确切形状的广义面。与使用 EXACT 方法创建的多边形相比，使用此方法创建的多边形的顶点数量要少得多。</bullet_item><para/>
        ///     <bullet_item>精确 - 表示符号化要素的确切形状的面。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Mask Kind")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _method_value _method { get; set; }

        public enum _method_value
        {
            /// <summary>
            /// <para>Box</para>
            /// <para>Box—A polygon representing the extent of the symbolized feature.</para>
            /// <para>框 - 表示符号化要素范围的面。</para>
            /// </summary>
            [Description("Box")]
            [GPEnumValue("BOX")]
            _BOX,

            /// <summary>
            /// <para>Convex hull</para>
            /// <para>Convex hull—The convex hull of the symbolized geometry of the feature. This is the default.</para>
            /// <para>凸包 - 特征符号化几何的凸包。这是默认设置。</para>
            /// </summary>
            [Description("Convex hull")]
            [GPEnumValue("CONVEX_HULL")]
            _CONVEX_HULL,

            /// <summary>
            /// <para>Exact simplified</para>
            /// <para>Exact simplified—A generalized polygon representing the exact shape of the symbolized feature. Polygons created with this method will have a significantly smaller number of vertices compared to polygons created with the EXACT method.</para>
            /// <para>精确简化 - 表示符号化要素的确切形状的广义面。与使用 EXACT 方法创建的多边形相比，使用此方法创建的多边形的顶点数量要少得多。</para>
            /// </summary>
            [Description("Exact simplified")]
            [GPEnumValue("EXACT_SIMPLIFIED")]
            _EXACT_SIMPLIFIED,

            /// <summary>
            /// <para>Exact</para>
            /// <para>Exact simplified—A generalized polygon representing the exact shape of the symbolized feature. Polygons created with this method will have a significantly smaller number of vertices compared to polygons created with the EXACT method.</para>
            /// <para>精确简化 - 表示符号化要素的确切形状的广义面。与使用 EXACT 方法创建的多边形相比，使用此方法创建的多边形的顶点数量要少得多。</para>
            /// </summary>
            [Description("Exact")]
            [GPEnumValue("EXACT")]
            _EXACT,

        }

        /// <summary>
        /// <para>Create masks for unplaced annotation</para>
        /// <para><xdoc>
        ///   <para>Specifies whether to create masks for unplaced annotation. This option is only used when masking geodatabase annotation layers.</para>
        ///   <bulletList>
        ///     <bullet_item>All annotation features—Creates masks for all the annotation features.</bullet_item><para/>
        ///     <bullet_item>Only placed annotation features—Only creates masks for features with a status of placed.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否为未置入的批注创建蒙版。此选项仅在屏蔽地理数据库注记图层时使用。</para>
        ///   <bulletList>
        ///     <bullet_item>所有注记特征 （All annotation feature） - 为所有注记特征创建掩码。</bullet_item><para/>
        ///     <bullet_item>仅放置注记要素 - 仅为状态为放置的要素创建蒙版。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Create masks for unplaced annotation")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _mask_for_non_placed_anno_value _mask_for_non_placed_anno { get; set; }

        public enum _mask_for_non_placed_anno_value
        {
            /// <summary>
            /// <para>All annotation features</para>
            /// <para>All annotation features—Creates masks for all the annotation features.</para>
            /// <para>所有注记特征 （All annotation feature） - 为所有注记特征创建掩码。</para>
            /// </summary>
            [Description("All annotation features")]
            [GPEnumValue("ALL_FEATURES")]
            _ALL_FEATURES,

            /// <summary>
            /// <para>Only placed annotation features</para>
            /// <para>Only placed annotation features—Only creates masks for features with a status of placed.</para>
            /// <para>仅放置注记要素 - 仅为状态为放置的要素创建蒙版。</para>
            /// </summary>
            [Description("Only placed annotation features")]
            [GPEnumValue("ONLY_PLACED")]
            _ONLY_PLACED,

        }

        /// <summary>
        /// <para>Transfer Attributes</para>
        /// <para><xdoc>
        ///   <para>Specifies the attributes that will be transferred from the input features to the output features.</para>
        ///   <bulletList>
        ///     <bullet_item>Only the FID field—Only the FID field from the input features will be transferred to the output features. This is the default.</bullet_item><para/>
        ///     <bullet_item>All attributes except the FID field—All the attributes except the FID from the input features will be transferred to the output features.</bullet_item><para/>
        ///     <bullet_item>All attributes—All the attributes from the input features will be transferred to the output features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将从输入要素传输到输出要素的属性。</para>
        ///   <bulletList>
        ///     <bullet_item>仅 FID 字段 - 仅输入要素中的 FID 字段将传输到输出要素。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>除 FID 字段外的所有属性—输入要素中除 FID 之外的所有属性都将传输到输出要素。</bullet_item><para/>
        ///     <bullet_item>所有属性—输入要素中的所有属性都将传输到输出要素。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Transfer Attributes")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _attributes_value _attributes { get; set; }

        public enum _attributes_value
        {
            /// <summary>
            /// <para>All attributes except the FID field</para>
            /// <para>All attributes except the FID field—All the attributes except the FID from the input features will be transferred to the output features.</para>
            /// <para>除 FID 字段外的所有属性—输入要素中除 FID 之外的所有属性都将传输到输出要素。</para>
            /// </summary>
            [Description("All attributes except the FID field")]
            [GPEnumValue("NO_FID")]
            _NO_FID,

            /// <summary>
            /// <para>Only the FID field</para>
            /// <para>Only the FID field—Only the FID field from the input features will be transferred to the output features. This is the default.</para>
            /// <para>仅 FID 字段 - 仅输入要素中的 FID 字段将传输到输出要素。这是默认设置。</para>
            /// </summary>
            [Description("Only the FID field")]
            [GPEnumValue("ONLY_FID")]
            _ONLY_FID,

            /// <summary>
            /// <para>All attributes</para>
            /// <para>All attributes except the FID field—All the attributes except the FID from the input features will be transferred to the output features.</para>
            /// <para>除 FID 字段外的所有属性—输入要素中除 FID 之外的所有属性都将传输到输出要素。</para>
            /// </summary>
            [Description("All attributes")]
            [GPEnumValue("ALL")]
            _ALL,

        }

        public IntersectingLayersMasks SetEnv(object cartographicCoordinateSystem = null, object cartographicPartitions = null)
        {
            base.SetEnv(cartographicCoordinateSystem: cartographicCoordinateSystem, cartographicPartitions: cartographicPartitions);
            return this;
        }

    }

}